/*
 * Supervisor.java
 */
package incidencias;

import accesoBD.*;
import java.sql.*;
import java.util.ArrayList;
import java.util.Iterator;

/**
 * Clase que trata el rol de Supervisor
 * @author Agustin Jimenez Fernandez
 * @version 10.0
 */
public class Supervisor {

    GeneraPDF gen;
    /**
     * Utilizado para hacer las consultas
     */
    public static QuerySupervisor query;

    /**
     * Constructor de la clase Supervisor
     * @param q QuerySupervisor para realizar las consultas con la BD
     */
    public Supervisor(QuerySupervisor q) {
        query = q;
        gen = new GeneraPDF();
    }

    /**
     * Obtenemos el identificador del tecnico pasado por parámetro
     * @param tec
     * @return Un objeto resultSet que contiene el identificador del tecnico.
     * @throws SQLException 
     */
    static ResultSet getId_Tecnico(String tec) throws SQLException {
        return query.getIdTecnico(tec);
    }

    /**
     * Obtenemos todos los partes del tecnico pasado por parametro
     * @param tecnico int con el identificador del tecnico
     * @return Un objeto ResultSet que contiene todos los partes de dicho tecnico
     * @throws SQLException 
     */
    static ResultSet getPartesAsignados(int tecnico) throws SQLException {
        return query.getPartesTecnico(String.valueOf(tecnico));
    }

    /**
     * Crea un parte de incidencia en la base de datos.
     * @param idAparato String que contiene el identificador del aparato.
     * @param text String con una breve descripción para el parte de incidencia.
     * @return Un objeto resultSet que contiene el resultado de la consulta
     * @throws SQLException
     */
    static boolean CrearParte(String idAparato, String text) throws SQLException {
        return query.crearParte(idAparato, text);
    }

    /**
     * Cierra un parte.
     * @param parte identificador del parte de incidencia.
     * @return Un boolean informando del éxito de la actualización.
     * @throws SQLException
     */
    static boolean CerrarParte(String parte) throws SQLException {
        return query.cerrarParte(parte);
    }

    /**
     * Añade una ubicación a la base de datos.
     * @param idArea Identificador del área.
     * @param sala Nombre de la sala.
     * @param planta Número de la planta.
     * @param pasillo Número del pasillo.
     * @return Un boolean informando del éxito de la creación.
     * @throws SQLException  
     */
    public static boolean addUbicacion(String idArea, String sala, String planta, String pasillo) throws SQLException {
        return query.addUbicacion(idArea, sala, planta, pasillo);
    }

    /**
     * Registra un nuevo aparato en la base de datos.
     * @param nombre Nombre del dispositivo.
     * @param codigoPub Codigo público del dispositivo.
     * @param condigoInt 
     * @param marca Marca del dispositivo.
     * @param modelo Modelo del dispositivo.
     * @param color Color del dispositivo.
     * @param garantia Garantía del dispositivo.
     * @param ubicacion Identificador de la ubicación del dispositivo.
     * @return Un boolean informando del éxito de la creación.
     * @throws SQLException  
     */
    public static boolean addAparato(String nombre, String codigoPub, String condigoInt, String marca, String modelo, String color, String garantia, String ubicacion) throws SQLException {
        return query.crearAparato(nombre, codigoPub, condigoInt, marca, modelo, color, garantia, ubicacion);
    }

    /**
     * Reasignamos el parte a otro técnico
     * @param tecnico 
     * @param parte 
     * @throws SQLException  
     */
    public static void reasignar(int tecnico, int parte) throws SQLException {
        query.reasignarParte(String.valueOf(tecnico), String.valueOf(parte));
    }

    /**
     * Reasignamos el parte con la incidencia y la actuacion a una empresa
     * @param CIFEmpresa String con el CIF de la empresa
     * @param parte int con el identificador del parte
     * @param notaAdjunta String con la ntoa que se añade
     * @return boolean indicando si se reasignó correctamente
     * @throws SQLException 
     */
    public static boolean reasignar(String CIFEmpresa, int parte, String notaAdjunta) throws SQLException {
        return query.externalizarActuacion(CIFEmpresa, String.valueOf(parte), notaAdjunta);
    }

    /**
     * Obtenemos la descripcion de todas las areas
     * @return objeto ResultSet con la descripción de todas las areas
     * @throws SQLException
     * @throws ClassNotFoundException 
     */
    public static ResultSet getAreas() throws SQLException, ClassNotFoundException {
        return query.getDescripcionArea();
    }

    /**
     * Obtenemos toda la información referente a los aparatos
     * @return objeto ResultSet con la información de todos los aparatos
     * @throws SQLException
     * @throws ClassNotFoundException 
     */
    public static ResultSet getAparatos() throws SQLException, ClassNotFoundException {
        return query.getAllAparatos();
    }

    /**
     * Obtenemos el identificador de la sala
     * @param sala String con la sala
     * @return String con el identificador de la sala
     * @throws SQLException 
     */
    public static String getUbicacion(String sala) throws SQLException {
        String ubicacion = "";
        ResultSet rset = query.getIdSala(sala);
        while (rset.next()) {
            ubicacion = rset.getString(1);
        }
        return ubicacion;
    }

    /**
     * Obtenemos las salas
     * @return objeto ResultSet con todas las salas
     * @throws SQLException
     * @throws ClassNotFoundException 
     */
    public static ResultSet getUbicaciones() throws SQLException, ClassNotFoundException {
        return query.getUbicaciones();
    }

    /**
     * Obtenemos informacion de los tecnicos
     * @return objeto ResultSet con la información de los tecnicos
     * @throws SQLException
     * @throws ClassNotFoundException 
     */
    public static ResultSet getTecnicos() throws SQLException, ClassNotFoundException {
        return query.getNombreTecnicos();
    }

    /**
     * Obtenemos todos los partes que están actualmente asignados a algún tecnico
     * @return ResultSet objeto con los partes que actualmente están asignados a un tecnico
     * @throws SQLException
     * @throws ClassNotFoundException 
     */
    public static ResultSet getPartesAsignados() throws SQLException, ClassNotFoundException {
        return query.getPartesAbiertos();
    }

    /**
     * Construimos información del usuario.
     * @param parte int del parte que queremos obtener la información
     * @return String con la información tratada
     * @throws SQLException 
     */
    public static String usuarioData(int parte) throws SQLException {
        int id_usuario, p;
        String email, nombre;

        ResultSet rset = query.getUsuario_Parte(String.valueOf(parte));
        while (rset.next()) {
            id_usuario = rset.getInt(1);
            nombre = rset.getString(2);
            email = rset.getString(3);
            p = rset.getInt(4);
            if (p == parte) {
                return ("Usuario: " + id_usuario + " - " + nombre + " - " + email);
            }
        }
        return "";
    }

    /**
     * Construimos información del parte.
     * @param parte int del parte que queremos obtener la información
     * @return String con la información tratada
     * @throws SQLException 
     */
    public static String parteData(int parte) throws SQLException {
        String descripcion = "", estado = "";
        int tecnico = 0;

        ResultSet rset = query.getDescEstadoParte(String.valueOf(parte));
        while (rset.next()) {
            descripcion = rset.getString(1);
            estado = rset.getString(2);
        }

        rset = query.getTecnico_Parte(String.valueOf(parte));
        while (rset.next()) {
            tecnico = rset.getInt(1);
        }
        return ("Descripcion: " + descripcion + "\nestado: " + estado + "\nTecnico: " + tecnico);
    }

    /**
     * Construimos información de la incidencia.
     * @param parte int del parte que queremos obtener la información
     * @return String con la información tratada
     * @throws SQLException 
     */
    public static String incidenciaData(int parte) throws SQLException {
        int id_incidencia = 0;
        String incidencia = "Incidencia: ";
        ArrayList lista_incidencias = new ArrayList();
        int actuacion = 0;
        int tiempo_estimado = 0;
        int tiempo_invertido = 0;
        int coste = 0;
        int id_empresa = 0;
        String fecha_entrega = "";
        String nombre_empresa = "";

        ResultSet rset = query.getIncidencia_Parte(String.valueOf(parte));
        while (rset.next()) {
            lista_incidencias.add(rset.getInt(1));
        }

        Iterator it = lista_incidencias.iterator();
        while (it.hasNext()) {
            id_incidencia = (Integer) it.next();
            rset = query.getCausa_Incidencia(String.valueOf(id_incidencia));
            while (rset.next()) {
                incidencia += rset.getString(1);
                incidencia += "\n";
            }
            rset = query.getActuacion_Incidencia(String.valueOf(id_incidencia));
            while (rset.next()) {
                actuacion = rset.getInt(1);
            }
            rset = query.getTiempo_Actuacion(String.valueOf(actuacion));
            while (rset.next()) {
                tiempo_estimado = rset.getInt(1);
                tiempo_invertido = rset.getInt(2);
                coste = rset.getInt(3);
            }
            rset = query.getEmpresa_Actuacion(String.valueOf(actuacion));
            while (rset.next()) {
                id_empresa = rset.getInt(1);
                fecha_entrega = rset.getString(2);
            }
            rset = query.getNombre_Empresa(String.valueOf(id_empresa));
            while (rset.next()) {
                nombre_empresa = rset.getString(1);
            }
            incidencia += "Actuacion:\nTiempo estimado: " + tiempo_estimado + "\nTiempo invertido: " + tiempo_invertido + "\nCoste: " + coste + "\nFecha entrega: " + fecha_entrega + "\nEmpresa: " + nombre_empresa + "\n\nIncidencia: ";
        }
        return ("Incidencias:\n" + incidencia);
    }

    /**
     * Construimos información del aparato.
     * @param parte int del parte que queremos obtener la información
     * @return String con la información tratada
     * @throws SQLException 
     */
    public static String aparatoData(int parte) throws SQLException {
        int id_aparato = 0, id_ubicacion = 0;
        String nombre_publico = "", sala = "";
        String desc = "";
        ResultSet rset = query.getAparatos(String.valueOf(parte));
        while (rset.next()) {
            desc = rset.getString(1);
            id_aparato = rset.getInt(2);

        }
        rset = query.getCodigo_Aparato(String.valueOf(id_aparato));
        while (rset.next()) {
            nombre_publico = rset.getString(1);
            id_ubicacion = rset.getInt(2);
        }
        rset = query.getSala_Ubicacion(String.valueOf(id_ubicacion));
        while (rset.next()) {
            sala = rset.getString(1);
        }
        return ("Aparato: " + nombre_publico + "\nSala: " + sala);
    }

    /**
     * 
     * @return Object[] Construimos un array de tecnicos
     * @throws SQLException 
     */
    public static Object[] tecnicos() throws SQLException {
        ArrayList<String> lista_tecnicos = new ArrayList<String>();
        ResultSet rset = query.getNombreTecnicos();
        while (rset.next()) {
            lista_tecnicos.add(String.valueOf(rset.getInt(1)) + ":" + rset.getString(2));
        }
        return lista_tecnicos.toArray(new String[lista_tecnicos.size()]);
    }

    /**
     * 
     * @return Object[] Construimos un array de empresas
     * @throws SQLException 
     */
    public static Object[] empresas() throws SQLException {
        ArrayList<String> lista_empresas = new ArrayList<String>();
        ResultSet rset = query.getAllEmpresa();
        while (rset.next()) {
            lista_empresas.add(rset.getString(1) + " : " + rset.getString(2) + " : " + rset.getString(3));
        }
        //System.out.println(lista_empresas);
        return lista_empresas.toArray(new String[lista_empresas.size()]);
    }

    /**
     * Obtenemos el identificador del area
     * @param area String del area que queremos obtener su id
     * @return int con el identificador del area
     * @throws SQLException 
     */
    public static int getIdArea(String area) throws SQLException {
        int id_area = 0;
        ResultSet rset = query.getIdArea(area);
        while (rset.next()) {
            id_area = rset.getInt(1);
        }
        return id_area;
    }

    /**
     * Obtenemos los partes que estan asignados a una empresa externa
     * @return objeto ResultSet con los partes que estan asignados a empresas externas
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public static ResultSet getPartesExternos() throws SQLException, ClassNotFoundException {
        return query.getPartesExternos();
    }
}
